#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "../../inc/CJSON.h"
#include "../../inc/login.h"
#include "../../inc/tcp.h"
#include "../../inc/homepage.h"
#include "../inc/user_event.h"

static char * build_json_request(const char * message, const char * target_id);

// 整合私聊信息为指定格式的JSON字符串
void send_private_chat(const char * message, const char * target_id)
{
    char * json_str = build_json_request(message, target_id);
    if(json_str != NULL) {
        send_message_to_server(&server_info, json_str);
    }
}

// 构建 JSON 请求字符串
static char * build_json_request(const char * message, const char * target_id)
{
    if(user_event.userid == NULL || strlen(user_event.userid) == 0) {
        printf("private_chat error: 未登录\n");
        return NULL;
    }

    cJSON * root = cJSON_CreateObject();
    if(root == NULL) {
        printf("private_chat error: 创建根JSON对象失败\n");
        return NULL;
    }

    if(strcmp(user_event.type, "chat_room") == 0) {
        cJSON_AddStringToObject(root, "type", user_event.type);
    } else {
        cJSON_AddStringToObject(root, "type", "private_chat");
    }

    cJSON * payload = cJSON_CreateObject();
    if(payload == NULL) {
        fprintf(stderr, "private_chat error: 创建payload子对象失败\n");
        cJSON_Delete(root); // 释放已创建的根对象，避免内存泄漏
        return NULL;
    }

    cJSON_AddItemToObject(root, "payload", payload); // 将payload挂载到根对象

    char message_id[64] = {0};
    struct timeval tv;
    gettimeofday(&tv, NULL); // 获取当前时间（秒+微秒，比time()更精确）
    snprintf(message_id, sizeof(message_id),
             "msg_%lld%03d",                                  // 示例：msg_1695876321001（秒转毫秒+微秒取前3位）
             (long long)tv.tv_sec * 1000 + tv.tv_usec / 1000, // 毫秒级时间戳
             rand() % 1000);                                  // 加0-999随机数，防止同一毫秒生成重复ID
    cJSON_AddStringToObject(payload, "message_id", message_id);

    cJSON_AddStringToObject(payload, "sender_userid", user_event.userid);
    cJSON_AddStringToObject(payload, "target_id", user_event.target_id);
    cJSON_AddStringToObject(payload, "content", message);
    cJSON_AddStringToObject(payload, "type", "text");

    char send_time[40]   = {0};
    struct tm * local_tm = localtime(&tv.tv_sec);
    if(local_tm != NULL) {
        snprintf(send_time, sizeof(send_time),
                 "%04d-%02d-%02dT%02d:%02d:%02d.%03d+08:00", // +08:00表示东八区（北京时间）
                 local_tm->tm_year + 1900,                   // 年（tm_year是1900年至今的偏移，需+1900）
                 local_tm->tm_mon + 1,                       // 月（0-11，需+1）
                 local_tm->tm_mday,                          // 日（1-31）
                 local_tm->tm_hour,                          // 时（0-23）
                 local_tm->tm_min,                           // 分（0-59）
                 local_tm->tm_sec,                           // 秒（0-59）
                 (int)(tv.tv_usec / 1000));                  // 毫秒（微秒/1000，取整）
    } else {
        // 时间获取失败时的兜底值（避免JSON字段缺失）
        strncpy(send_time, "2025-09-27T19:45:21.123+08:00", sizeof(send_time) - 1);
        fprintf(stderr, "private_chat warning: 本地时间获取失败，使用默认时间\n");
    }

    cJSON_AddStringToObject(payload, "send_time", send_time);

    if(strcmp(user_event.type, "chat_room") == 0) {
        cJSON_AddStringToObject(payload, "chat_type", "chat_room");
    } else {
        cJSON_AddStringToObject(payload, "chat_type", "single");
    }

    char * json_str = cJSON_Print(root);

    if(json_str == NULL) {
        fprintf(stderr, "private_chat error: JSON对象转字符串失败\n");
        cJSON_Delete(root);
        return NULL;
    }

    cJSON_Delete(root);

    return json_str;
}
